home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / pcd2_126 / pcd2_126.lzh / PCD_MS.HAS < prev    next >
Text File  |  1997-06-01  |  12KB  |  624 lines

  1. **************************************************
  2. * マウス関連サブルーチン
  3. *
  4. * 実行形式・ソース共、利用に制限はありませんが
  5. * 無保証であることだけは保証します
  6. *                 by まる丸 1997
  7. **************************************************
  8.  
  9.  
  10. *------------------------------
  11. * インクルード&外部参照
  12. *------------------------------
  13.  
  14.     .include    iocscall.mac
  15.     .include    c:\free\agiocs\agiocs.mac
  16.  
  17.     .xref    V_FLAME
  18.     .xref    SW_S,SW_LX,SW_LY,IMAGE_NUM
  19.     .xref    M_TBL_X,M_TBL_Y,M_TBL_J,SEL
  20.     .xdef    MS_FLG,FLG_MS,MS_INIT,MS_CHECK,MScsrON,MScsrOFF,MS_X,MS_Lcl
  21.     .xdef    G_MODE,limitB,limitE,get_num,get_txt,put_txt
  22.  
  23. *------------------------------
  24. * プログラム部
  25. *------------------------------
  26.     .cpu    68000
  27.     .text
  28.     .align    4
  29.  
  30. *------------------------------
  31. * マウスの初期設定
  32. *------------------------------
  33. MS_INIT:
  34.     movem.l    d0-d1,-(sp)
  35.     clr.b    MS_FLG
  36.     tst.l    V_FLAME
  37.     bmi    @f
  38.     clr.w    limitB
  39.     moveq.l    #-1,d1
  40.     IOCS    _CRTMOD
  41.     cmpi.b    #12,d0
  42.     beq    2f
  43.     move.b    #3,G_MODE
  44.     move.w    #767,limitE
  45.     bra    1f
  46. 2:    move.b    #2,G_MODE
  47.     move.w    #767,limitE
  48.     bra    1f
  49. @@:    tst.b    SW_S
  50.     bne    @f
  51.     clr.w    limitB
  52.     move.w    #511,limitE
  53.     clr.b    G_MODE
  54.     bra    1f
  55. @@:    move.w    #128,limitB
  56.     move.w    #639,limitE
  57.     move.b    #1,G_MODE
  58. 1:    IOCS    _MS_CURGT        *マウスカーソルの位置ゲット
  59.     cmpi.w    #511,d0
  60.     bls    @f
  61.     move.w    #500,d0
  62. @@:    swap    d0
  63.     cmp.w    limitB,d0
  64.     bcc    @f
  65.     move.w    SW_LX,d0
  66.     add.w    #10,d0
  67.     bra    1f
  68. @@:    cmp.w    limitE,d0
  69.     bls    1f
  70.     move.w    limitE,d0
  71.     sub.w    #10,d0
  72. 1:    swap    d0
  73.     bsr    MScsrSET
  74.     move.l    d0,MS_X
  75.     clr.b    FLG_MS
  76.     movem.l    (sp)+,d0-d1
  77.     rts
  78.  
  79. *------------------------------
  80. * マウスが押されたかチェック
  81. *------------------------------
  82. MS_CHECK:
  83.     tst.b    MS_FLG            *マウスは使用可能か?
  84.     bne    1f            *不能なら終わり
  85.     bsr    MS_DRAW
  86.     IOCS    _MS_GETDT        *左ボタンが押されているか
  87.     tst.w    d0            *押されていなければ
  88.     beq    1f            *終り
  89.     movem.l    d1,-(sp)
  90.     moveq.l    #0,d1
  91. @@:    or.w    d0,d1
  92.     IOCS    _MS_CUROF        *HumanのマウスカーソルOFF
  93.     IOCS    _MS_GETDT        *ボタンが押されているか
  94.     bsr    MS_DRAW
  95.     tst.w    d0            *押されていれば
  96.     bne    @b            *離されるまでループ
  97.     exg    d0,d1
  98.     movem.l    (sp)+,d1
  99.     cmpi.w    #-1,d0
  100.     beq    2f
  101.     tst.b    d0
  102.     bne    3f
  103.     bsr    get_num
  104.     st.b    MS_Lcl            *クリックのフラグセット
  105.     rts
  106. 1:    moveq.l    #0,d0
  107.     clr.b    MS_Lcl            *クリックのフラグリセット
  108.     rts
  109. 2:    moveq.l    #0,d0
  110.     clr.b    MS_Lcl            *クリックのフラグリセット
  111.     move.w    #207,d0
  112.     rts
  113. 3:    moveq.l    #0,d0
  114.     clr.b    MS_Lcl            *クリックのフラグリセット
  115.     move.w    #203,d0
  116.     rts
  117.  
  118. *------------------------------
  119. * マウス座標をメニュー番号に変換
  120. *------------------------------
  121. get_num:
  122.     tst.b    FLG_MS
  123.     beq    3f
  124.     movem.l    d1-d4/a0-a1,-(sp)
  125.     tst.b    MS_FLG
  126.     bne    4f
  127.     lea.l    M_TBL_X,a0
  128.     lea.l    M_TBL_Y,a1
  129.     move.w    SEL,d1
  130.     subq.w    #1,d1
  131.     moveq.l    #0,d2
  132.     move.w    MS_X,d3
  133.     move.w    MS_Y,d4
  134. 1:    cmp.w    0(a1,d2.w),d4
  135.     bcs    @f
  136.     cmp.w    2(a1,d2.w),d4
  137.     bhi    @f
  138.     cmp.w    0(a0,d2.w),d3
  139.     bcs    @f
  140.     cmp.w    2(a0,d2.w),d3
  141.     bhi    @f
  142.     lsr.w    #2,d2
  143.     move.l    d2,d0
  144.     addq.l    #1,d0
  145.     bra    2f
  146. @@:    addq.w    #4,d2
  147.     dbra    d1,1b
  148. 4:    moveq.l    #0,d0
  149. 2:    movem.l    (sp)+,d1-d4/a0-a1
  150.     rts
  151. 3:    moveq.l    #1,d0
  152.     rts
  153.  
  154. *------------------------------
  155. * マウスカーソルの描画
  156. *------------------------------
  157. MS_DRAW:
  158.     tst.b    MS_FLG
  159.     bne    1f
  160.     movem.l    d0,-(sp)
  161.     IOCS    _MS_CURGT        *マウスカーソルの位置ゲット
  162.     bsr    MScsrSET        *マウスカーソルの位置セット
  163.     tst.b    FLG_MS            *マウスカーソルは表示されているか?
  164.     beq    @f            *してなければ終わり
  165.     cmp.l    MS_X,d0            *位置は前回と同じか
  166.     beq    @f            *同じなら終わり
  167.     bsr    MScsrOFF        *違ったら一度消して
  168.     move.l    d0,MS_X            *新しい座標で
  169.     bsr    MScsrON            *表示
  170. @@:    move.l    d0,MS_X
  171.     movem.l    (sp)+,d0
  172. 1:    rts
  173.  
  174. *------------------------------
  175. * マウスカーソル表示
  176. *------------------------------
  177. MScsrON:
  178.     tst.b    MS_FLG
  179.     bne    1f
  180.     tst.b    FLG_MS
  181.     bne    1f
  182.     cmpi.b    #1,G_MODE
  183.     bne    @f
  184.     cmpi.w    #2,IMAGE_NUM
  185.     beq    1f
  186. @@:    movem.l    d0-d2,-(sp)
  187.     clr.l    d0
  188.     move.w    #12,d2
  189.     move.w    MS_X,d0
  190.     sub.w    limitB,d0        *書き込み開始X座標
  191.     move.w    d0,d1
  192.     add.w    d2,d1
  193.     sub.w    limitE,d1
  194.     add.w    limitB,d1
  195.     subq.w    #1,d1
  196.     ble    @f
  197.     sub.w    d1,d2            *マウスの横ドット数
  198. @@:    swap    d2
  199.     move.w    #16,d2
  200.     move.w    MS_Y,d1            *書き込み開始Y座標
  201.     add.w    d2,d1
  202.     sub.w    #512,d1
  203.     ble    @f
  204.     sub.w    d1,d2            *マウスの縦ドット数
  205. @@:    move.l    d2,MS_sx
  206.     tst.l    V_FLAME
  207.     bge    @f
  208.     clr.l    d1
  209.     move.w    MS_Y,d1            *Y座標を
  210.     swap    d1            *1024倍して
  211.     lsr.l    #6,d1
  212.     add.w    d0,d0            *X座標を2倍した数値を
  213.     add.l    d0,d1            *足し算し
  214.     add.l    #$c00000,d1        *G-RAMの先頭アドレスを足せば
  215.     move.l    d1,MS_ADR        *書き込み開始アドレスになる
  216. @@:    bsr    get_gram
  217.     bsr    put_csr
  218.     st.b    FLG_MS
  219.     movem.l    (sp)+,d0-d2
  220. 1:    rts
  221.  
  222. *------------------------------
  223. * グラフィック退避
  224. *------------------------------
  225. get_gram:
  226.     tst.b    MS_FLG
  227.     bne    2f
  228.     tst.l    V_FLAME
  229.     bge    get_GA
  230.     movem.l    d0-d2/a0-a3,-(sp)
  231.     suba.l    a1,a1
  232.     IOCS    _B_SUPER
  233.     move.l    d0,a3
  234.     move.l    MS_ADR,a0
  235.     move.l    a0,a1
  236.     move.l    MS_sx,d0
  237.     move.w    d0,d2
  238.     subq.w    #1,d2
  239.     swap    d0
  240.     subq.w    #1,d0
  241.     lea.l    MS_BUF,a2
  242. 1:    move.l    a0,a1
  243.     move.w    d0,d1
  244. @@:    move.w    (a1)+,(a2)+
  245.     dbra    d1,@b
  246.     add.l    #1024,a0
  247.     dbra    d2,1b
  248.     move.l    a3,a1
  249.     IOCS    _B_SUPER
  250.     movem.l    (sp)+,d0-d2/a0-a3
  251. 2:    rts
  252.  
  253. get_GA:
  254.     movem.l    d0-d5/a0-a3,-(sp)
  255.     suba.l    a1,a1
  256.     IOCS    _B_SUPER
  257.     move.l    d0,a3
  258.     move.w    MS_sx,d3
  259.     subq.w    #1,d3
  260.     lea.l    MS_BUF,a2
  261.     move.l    MS_X,d4
  262.  
  263. @@:    moveq.l    #15,d5
  264. 1:    move.l    d4,d2
  265.     AGIOCS    _A_G_GETFRM
  266.     move.l    a1,a0
  267.     move.w    d3,d1
  268. @@:    move.w    (a0)+,(a2)+
  269.     move.w    (a0)+,(a2)+
  270.     dbra    d1,@b
  271.     move.l    d0,d2
  272.     AGIOCS    _A_G_SETFRM
  273.     addq.w    #1,d4
  274.     cmpi.w    #512,d4
  275.     dbcc    d5,1b
  276.     move.l    a3,a1
  277.     IOCS    _B_SUPER
  278.     movem.l    (sp)+,d0-d5/a0-a3
  279.     rts
  280.  
  281. *------------------------------
  282. * グラフィック復帰
  283. *------------------------------
  284. put_gram:
  285.     tst.b    MS_FLG
  286.     bne    2f
  287.     tst.l    V_FLAME
  288.     bge    put_GA
  289.     movem.l    d0-d2/a0-a3,-(sp)
  290.     suba.l    a1,a1
  291.     IOCS    _B_SUPER
  292.     move.l    d0,a3
  293.     move.l    MS_ADR,a0
  294.     move.l    a0,a1
  295.     move.l    MS_sx,d0
  296.     move.w    d0,d2
  297.     subq.w    #1,d2
  298.     swap    d0
  299.     subq.w    #1,d0
  300.     lea.l    MS_BUF,a2
  301. 1:    move.l    a0,a1
  302.     move.w    d0,d1
  303. @@:    move.w    (a2)+,(a1)+
  304.     dbra    d1,@b
  305.     add.l    #1024,a0
  306.     dbra    d2,1b
  307.     move.l    a3,a1
  308.     IOCS    _B_SUPER
  309.     movem.l    (sp)+,d0-d2/a0-a3
  310. 2:    rts
  311.  
  312. put_GA:
  313.     movem.l    d0-d5/a0-a3,-(sp)
  314.     suba.l    a1,a1
  315.     IOCS    _B_SUPER
  316.     move.l    d0,a3
  317.     move.w    MS_sx,d3
  318.     subq.w    #1,d3
  319.     lea.l    MS_BUF,a2
  320.     move.l    MS_X,d4
  321.     moveq.l    #15,d5
  322. 1:    move.l    d4,d2
  323.     AGIOCS    _A_G_GETFRM
  324.     move.l    a1,a0
  325.     move.w    d3,d1
  326. @@:    move.w    (a2)+,(a0)+
  327.     move.w    (a2)+,(a0)+
  328.     dbra    d1,@b
  329.     move.l    d0,d2
  330.     AGIOCS    _A_G_SETFRM
  331.     addq.w    #1,d4
  332.     cmpi.w    #512,d4
  333.     dbcc    d5,1b
  334.     move.l    a3,a1
  335.     IOCS    _B_SUPER
  336.     movem.l    (sp)+,d0-d5/a0-a3
  337.     rts
  338.  
  339. *------------------------------
  340. * マウスカーソル書き込み
  341. *------------------------------
  342. put_csr:
  343.     tst.b    MS_FLG
  344.     bne    3f
  345.     tst.l    V_FLAME
  346.     bge    csr_GA
  347.     movem.l    d0-d3/a0-a3,-(sp)
  348.     suba.l    a1,a1
  349.     IOCS    _B_SUPER
  350.     move.l    d0,a3
  351.     move.l    MS_ADR,a0
  352.     move.l    a0,a1
  353.     move.l    MS_sx,d0
  354.     move.w    d0,d2
  355.     subq.w    #1,d2
  356.     swap    d0
  357.     lea.l    MS_data,a2
  358. 1:    move.l    a0,a1
  359.     move.w    d0,d1
  360.     move.w    (a2)+,d3
  361. 2:    subq.w    #1,d1
  362.     bmi    @f
  363.     move.w    (a2),(a1)+
  364. @@:    addq.l    #2,a2
  365.     dbra    d3,2b
  366.     add.l    #1024,a0
  367.     dbra    d2,1b
  368.     move.l    a3,a1
  369.     IOCS    _B_SUPER
  370.     movem.l    (sp)+,d0-d3/a0-a3
  371. 3:    rts
  372.  
  373. csr_GA:
  374.     movem.l    d0-d6/a0-a3,-(sp)
  375.     suba.l    a1,a1
  376.     IOCS    _B_SUPER
  377.     move.l    d0,a3
  378.     lea.l    MS_data,a2
  379.     move.w    MS_sx,d3
  380.     move.l    MS_X,d4
  381.     moveq.l    #15,d6
  382. 1:    move.l    d4,d2
  383.     AGIOCS    _A_G_GETFRM
  384.     move.l    a1,a0
  385.     move.w    d3,d1
  386.     move.w    (a2)+,d5
  387. 2:    subq.w    #1,d1
  388.     bmi    @f
  389.     move.w    (a2),(a0)+
  390.     move.w    (a2),(a0)+
  391. @@:    addq.l    #2,a2
  392.     dbra    d5,2b
  393.     move.l    d0,d2
  394.     AGIOCS    _A_G_SETFRM
  395.     addq.l    #1,d4
  396.     cmpi.w    #512,d4
  397.     dbcc    d6,1b
  398.     move.l    a3,a1
  399.     IOCS    _B_SUPER
  400.     movem.l    (sp)+,d0-d6/a0-a3
  401.     rts
  402.  
  403. *------------------------------
  404. * マウスカーソル消去
  405. *------------------------------
  406. MScsrOFF:
  407.     tst.b    FLG_MS
  408.     beq    @f
  409.     bsr    put_gram
  410.     clr.b    FLG_MS
  411. @@:    rts
  412.  
  413. *------------------------------
  414. * マウスの座標指定
  415. *------------------------------
  416. MScsrSET:
  417.     tst.b    MS_FLG
  418.     bne    2f
  419.     movem.l    d1-d2,-(sp)
  420.     cmpi.w    #511,d0
  421.     bls    @f
  422.     move.w    #511,d0
  423. @@:    swap    d0
  424.     cmp.w    limitB,d0
  425.     bcc    @f
  426.     move.w    limitB,d0
  427.     bra    1f
  428. @@:    cmp.w    limitE,d0
  429.     bls    1f
  430.     move.w    limitE,d0
  431. 1:    swap    d0
  432.     move.l    d0,d2
  433.     move.l    d0,d1
  434.     IOCS    _MS_CURST
  435.     tst.l    d0
  436.     bge    @f
  437.     st.b    MS_FLG        *マウス使用不可
  438. @@:    cmpi.b    #2,G_MODE
  439.     bne    @f
  440.     swap    d2
  441.     move.w    d2,d0
  442.     add.w    d2,d2
  443.     add.w    d0,d2
  444.     lsr.w    #1,d2
  445.     swap    d2
  446. @@:    exg    d2,d0
  447.     movem.l    (sp)+,d1-d2
  448.     rts
  449. 2:    clr.l    d0
  450.     rts
  451.  
  452. *------------------------------
  453. * テキスト画面のカーソル
  454. *------------------------------
  455. get_txt:
  456.     tst.b    FLG_MS
  457.     bne    1f
  458.     movem.l    d0-d2/a0-a3,-(sp)
  459.     move.l    d0,MS_X
  460.     bsr    get_tx_adr
  461.     lea.l    $e00000,a0
  462.     adda.l    MS_ADR,a0
  463.     moveq.l    #15,d1
  464.     lea.l    MS_BUF,a1
  465.     lea.l    MS_data_t,a2
  466.     move.w    MS_sx,d2
  467. @@:    lea.l    ms_wk,a3
  468.     moveq.l    #0,d0
  469.     move.w    (a2)+,d0
  470.     swap    d0
  471.     lsr.l    d2,d0
  472.     move.l    d0,ms_wk
  473.     move.b    (a3)+,d0
  474.     move.b    (a0),(a1)+
  475.     or.b    d0,(a0)+
  476.     move.b    (a3)+,d0
  477.     move.b    (a0),(a1)+
  478.     or.b    d0,(a0)+
  479.     move.b    (a3)+,d0
  480.     move.b    (a0),(a1)+
  481.     or.b    d0,(a0)+
  482.     adda.l    #125,a0
  483.     dbra    d1,@b
  484.     lea.l    $e20000,a0
  485.     adda.l    MS_ADR,a0
  486.     adda.l    #256,a0
  487.     moveq.l    #11,d1
  488. @@:    lea.l    ms_wk,a3
  489.     moveq.l    #0,d0
  490.     move.w    (a2)+,d0
  491.     swap    d0
  492.     lsr.l    d2,d0
  493.     move.l    d0,ms_wk
  494.     move.b    (a3)+,d0
  495.     move.b    (a0),(a1)+
  496.     or.b    d0,(a0)+
  497.     move.b    (a3)+,d0
  498.     move.b    (a0),(a1)+
  499.     or.b    d0,(a0)+
  500.     move.b    (a3)+,d0
  501.     move.b    (a0),(a1)+
  502.     or.b    d0,(a0)+
  503.     adda.l    #125,a0
  504.     dbra    d1,@b
  505.     st.b    FLG_MS
  506.     movem.l    (sp)+,d0-d2/a0-a3
  507. 1:    rts
  508.  
  509. *------------------------------
  510. put_txt:
  511.     tst.b    FLG_MS
  512.     beq    1f
  513.     movem.l    d1/a0-a1,-(sp)
  514.     lea.l    $e00000,a0
  515.     adda.l    MS_ADR,a0
  516.     moveq.l    #15,d1
  517.     lea.l    MS_BUF,a1
  518. @@:    move.b    (a1)+,(a0)+
  519.     move.b    (a1)+,(a0)+
  520.     move.b    (a1)+,(a0)+
  521.     adda.l    #125,a0
  522.     dbra    d1,@b
  523.     lea.l    $e20000,a0
  524.     adda.l    MS_ADR,a0
  525.     adda.l    #256,a0
  526.     moveq.l    #11,d1
  527. @@:    move.b    (a1)+,(a0)+
  528.     move.b    (a1)+,(a0)+
  529.     move.b    (a1)+,(a0)+
  530.     adda.l    #125,a0
  531.     dbra    d1,@b
  532.     clr.b    FLG_MS
  533.     movem.l    (sp)+,d1/a0-a1
  534. 1:    rts
  535.  
  536. *------------------------------
  537. get_tx_adr:
  538.     movem.l    d0-d2,-(sp)
  539.     move.w    d0,d1
  540.     mulu.w    #128,d1
  541.     moveq.l    #0,d2
  542.     swap    d0
  543.     move.w    d0,d2
  544.     lsr.w    #3,d2
  545.     add.l    d2,d1
  546.     move.l    d1,MS_ADR
  547.     andi.w    #7,d0
  548.     move.w    d0,MS_sx
  549.     movem.l    (sp)+,d0-d2
  550.     rts
  551.  
  552. *------------------------------
  553. * 固定データ部
  554. *------------------------------
  555.     .data
  556.     .align    4
  557. MS_data:
  558.     .dc.w     0, 0
  559.     .dc.w     1, 0, 0
  560.     .dc.w     2, 0,-1, 0
  561.     .dc.w     3, 0,-1,-1, 0
  562.     .dc.w     4, 0,-1,-1,-1, 0
  563.     .dc.w     5, 0,-1,-1,-1,-1, 0
  564.     .dc.w     6, 0,-1,-1,-1,-1,-1, 0
  565.     .dc.w     7, 0,-1,-1,-1,-1,-1,-1, 0
  566.     .dc.w     8, 0,-1,-1,-1,-1,-1,-1,-1, 0
  567.     .dc.w     9, 0,-1,-1,-1,-1,-1,-1,-1,-1, 0
  568.     .dc.w    10, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0
  569.     .dc.w    11, 0,-1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0
  570.     .dc.w     3, 0,-1,-1, 0
  571.     .dc.w     2, 0,-1, 0
  572.     .dc.w     1, 0, 0
  573.     .dc.w     0, 0
  574.  
  575. MS_data_t:
  576.     .dc.w    %1000000000000000
  577.     .dc.w    %1100000000000000
  578.     .dc.w    %1110000000000000
  579.     .dc.w    %1111000000000000
  580.     .dc.w    %1111100000000000
  581.     .dc.w    %1111110000000000
  582.     .dc.w    %1111111000000000
  583.     .dc.w    %1111111100000000
  584.     .dc.w    %1111111110000000
  585.     .dc.w    %1111111111000000
  586.     .dc.w    %1111111111100000
  587.     .dc.w    %1111111111110000
  588.     .dc.w    %1111000000000000
  589.     .dc.w    %1110000000000000
  590.     .dc.w    %1100000000000000
  591.     .dc.w    %1000000000000000
  592.     .dc.w    %0100000000000000
  593.     .dc.w    %0110000000000000
  594.     .dc.w    %0111000000000000
  595.     .dc.w    %0111100000000000
  596.     .dc.w    %0111110000000000
  597.     .dc.w    %0111111000000000
  598.     .dc.w    %0111111100000000
  599.     .dc.w    %0111111110000000
  600.     .dc.w    %0111111111000000
  601.     .dc.w    %0111000000000000
  602.     .dc.w    %0110000000000000
  603.     .dc.w    %0100000000000000
  604.  
  605. *------------------------------
  606. * ワークエリア
  607. *------------------------------
  608.     .bss
  609.     .align    4
  610. MS_limit:
  611. limitB:    .ds.w    1            *マウスX方向の移動範囲
  612. limitE:    .ds.w    1            *マウスX方向の移動範囲
  613. MS_X:    .ds.w    1            *マウスのX座標
  614. MS_Y:    .ds.w    1            *マウスのY座標
  615. MS_sx:    .ds.w    1            *マウスカーソルの横サイズ
  616. MS_sy:    .ds.w    1            *マウスカーソルの縦サイズ
  617. ms_wk:    .ds.l    1
  618. MS_ADR:    .ds.l    1
  619. MS_BUF:    .ds.l    192            *12x16
  620. FLG_MS:    .ds.b    1
  621. MS_FLG:    .ds.b    1            *0=マウス使用可能 0以外使用不能
  622. G_MODE:    .ds.b    1            *3:2=0 1:1=1 GA3:2=2 GA1:1=3
  623. MS_Lcl:    .ds.b    1            *クリックされたらセット
  624.